In the latter half of the twentieth century, there began a phenomenon known as the information revolution. While the information revolution is a historical development broader in scope than any one event or machine, no single device has come to represent the information revolution more than the digital electronic computer. The development of computer systems has surely been a revolution. Each year, computer systems grow faster, store more data, and provide more applications to their users.
A modern computer system typically comprises one or more central processing units (CPU) and supporting hardware necessary to store, retrieve and transfer information, such as communication buses and memory. It also includes hardware necessary to communicate with the outside world, such as input/output controllers or storage controllers, and devices attached thereto such as keyboards, monitors, tape drives, disk drives, communication lines coupled to a network, etc. The CPU or CPUs are the heart of the system. They execute the instructions which comprise a computer program and directs the operation of the other system components.
From the standpoint of the computer's hardware, most systems operate in fundamentally the same manner. Processors are capable of performing a limited set of very simple operations, such as arithmetic, logical comparisons, and movement of data from one location to another. But each operation is performed very quickly. Sophisticated software at multiple levels directs a computer to perform massive numbers of these simple operations, enabling the computer to perform complex tasks. What is perceived by the user as a new or improved capability of a computer system is made possible by performing essentially the same set of very simple operations, but using software having enhanced function, along with faster hardware.
In the very early history of the digital computer, computer programs which instructed the computer to perform some task were written in a form directly executable by the computer's processor. Such programs were very difficult for a human to write, understand and maintain, even when performing relatively simple tasks. As the number and complexity of such programs grew, this method became clearly unworkable. As a result, alternate forms of creating and executing computer software were developed.
The evolution of computer software has led to the creation of sophisticated software development environments. These environments typically contain a range of tools for supporting the development of software in one or more high-level languages. For example, interactive source editors support the initial generation of source code by a developer. Source databases may support collections of source modules or source objects, which serve as the component parts of software applications. Front-end compiler/debuggers perform simple semantic verification of the source and reduction to a standard form. Back-end or optimizing compilers generate machine executable object code from the standard form, and may optimize the performance of this code using any of various optimization techniques. Build utilities assemble multiple object code modules into fully functioning computer programs.
Among the tools available in many such programming development environments are a range of diagnostic and debug tools for analyzing the execution of computer programming code, particularly compiled code. A common analytical technique is the use of breakpoints. A breakpoint is a location in a code sequence at which execution of a program may be halted, and the state of the machine examined. A breakpoint may be unconditional, meaning that the execution of the program is halted whenever the breakpoint is encountered, but is more typically conditional, meaning that execution of the program is halted only if certain conditions are met when the breakpoint is encountered. A typical such condition would be the value(s) of one or more program variables.
In general, conditional breakpoints are intended to trigger when something unexpected is happening in the computer program. A programmer will therefore insert multiple breakpoints at respective key locations in the code sequence, and specify the expected values of some key variables as conditions for the breakpoints. If the program is executing as expected, the conditional breakpoints do not trigger. Only if a conditional breakpoint is encountered, and the value(s) of the variable(s) specified as the condition of the breakpoint are something other than what was expected, is program execution halted. Conditional breakpoints are thus used to flag unexpected program conditions, without halting the program and requiring the programmer to analyze machine state in a large number of purely normal conditions.
Various conventional analytical tools support the use of breakpoints in a debug environment. These tools, e.g., allow the programmer to specify the location of a breakpoint, optionally, a condition for firing the breakpoint based on the value(s) of one or more program variables. If the breakpoint is triggered during execution, the debugger allows the programmer to examine the various program state variables in an effort to understand what is happening during execution.
As useful as these techniques are, applicants have observed that conventional breakpoints don't always identify unexpected program conditions of which the programmer may wish to be aware. It is impractical to specify the state of every single machine variable as a condition for each breakpoint. Debug tools require the programmer to identify the key variables to be used to trigger the breakpoints, and the expected values thereof, but this requires the programmer to anticipate error conditions. It is entirely possible that the key variable(s) identified will have expected values, and therefore not fire the breakpoints, yet something abnormal is going on which the programmer did not anticipate. In such circumstances, it would be desirable to inform the programmer of the abnormality.
As programs grow in size and complexity, the difficulty of anticipating all possible error conditions and debugging code is bound to increase. A need exists for a more effective debug tools which will assist the programmer in identifying and rectifying unexpected conditions arising during execution of the program.